package heap


// 当前类以及所有的父类中都没有找到这个方法，则查找所有的父接口
// interfaces是这个类的所有直接父接口
func LookupMethodInInterface(interfaces []*Class, name string, descriptor string) *Method {
	// 遍历所有直接父接口
	for _, interf := range interfaces {
		// 在当前接口中查找方法
		for _, method := range interf.methods {
			if method.name == name && method.descriptor == descriptor {
				return method
			}
		}
		// 当前接口中没有找到，尝试去当前接口的父接口中查找，一个接口可能有多个父接口。递归
		method := LookupMethodInInterface(interf.interfaces, name, descriptor)
		if method != nil {
			return method
		}
	}

	// 所有的父接口中都没有找到这个方法
	return nil
}

// 从当前类以及所有的父类中查找这个方法
func LookupMethodInClass(class *Class, name string, descriptor string) *Method {
	// 从类中查找方法，如果找不到，则会从父类中查找。这个循环会遍历每一个父类
	for c := class; c != nil; c = class.superClass {
		// 对于遍历到的每一个类，在类中寻找具有指定的名称和描述符的方法
		// 重载方法具有相同的名称，但具有不同的描述符
		for _, method := range c.methods {
			if method.name == name && method.descriptor == descriptor {
				return method
			}
		}
	}
	// 所有的父类中都没有找到这个方法
	return nil
}